2009-09-28 23:13:00
如果要 typedef,搞出来的都是些很恶心的名字,自己看了也生气,还是不搞好了,就 size_t 和 int 玩到底吧。
把 Array 的接口又改得一塌糊涂了,重新贴一下:
1namespace xl
2{
3 template <typename ValueType>
4 class Array
5 {
6 public:
7 Array(size_t nSize = 0);
8 Array(size_t nSize, const ValueType &tValue);
9 Array(const Array<ValueType> &that);
10 ~Array();
11
12 public:
13 class Iterator
14 {
15 public:
16 Iterator();
17 Iterator(ValueType *pValue);
18 Iterator(ValueType *pValue, ValueType *pStart, ValueType *pEof);
19 Iterator(const Iterator &that);
20
21 private:
22 ValueType *m_pStart;
23 ValueType *m_pEof;
24 ValueType *m_pCurrent;
25
26 public:
27 ValueType &operator * ();
28 ValueType *operator -> ();
29
30 public:
31 Iterator &operator = (const Iterator &that);
32 bool operator == (const Iterator &that) const;
33 bool operator != (const Iterator &that) const;
34
35 public:
36 Iterator &operator ++ ();
37 Iterator operator ++ (int);
38 Iterator &operator -- ();
39 Iterator operator -- (int);
40
41 public:
42 Iterator operator +(int nDistance) const;
43 Iterator operator -(int nDistance) const;
44 Iterator &operator +=(int nDistance);
45 Iterator &operator -=(int nDistance);
46 };
47
48 class ReverseIterator : public Iterator
49 {
50 public:
51 ReverseIterator &operator ++ ();
52 ReverseIterator operator ++ (int);
53 ReverseIterator &operator -- ();
54 ReverseIterator operator -- (int);
55 };
56
57 public:
58 Iterator Begin() const;
59 Iterator End() const;
60 ReverseIterator RBegin() const;
61 ReverseIterator REnd() const;
62
63
64 public:
65 Array<ValueType> &operator=(const Array<ValueType> &that);
66 bool operator==(const Array<ValueType> &that) const;
67 bool operator!=(const Array<ValueType> &that) const;
68
69 public:
70 ValueType &operator[](size_t nIndex);
71 const ValueType &operator[](size_t nIndex) const;
72
73 public:
74 bool Empty();
75 size_t Size() const;
76 void SetSize(size_t nSize);
77
78 public:
79 void Insert(const Iterator &itBeforeWhich, const ValueType &tValue);
80 void Insert(const ReverseIterator &itBeforeWhich, const ValueType &tValue);
81 void PushFront(const ValueType &tValue);
82 void PushBack(const ValueType &tValue);
83 template <typename IteratorType>
84 void Insert(const Iterator &itBeforeWhich, const IteratorType &itFirstToInsert, const IteratorType &itAfterLastToInsert);
85 template <typename IteratorType>
86 void Insert(const ReverseIterator &itBeforeWhich, const IteratorType &itFirstToInsert, const IteratorType &itAfterLastToInsert);
87 Iterator Delete(const Iterator &itWhich);
88 ReverseIterator Delete(const ReverseIterator &itWhich);
89 void PopFront();
90 void PopBack();
91 Iterator Delete(const Iterator &itFirstToInsert, const Iterator &itAfterLastToDelete);
92 Iterator Delete(const ReverseIterator &itFirstToInsert, const ReverseIterator &itAfterLastToDelete);
93 void Clear();
94 void SetValue(const Iterator &itWhich, const ValueType &tValue);
95 void SetValue(const ReverseIterator &itWhich, const ValueType &tValue);
96 void SetValue(const Iterator &itFirstToSet, const Iterator &itAfterLastToSet, const ValueType &tValue);
97 void SetValue(const ReverseIterator &itFirstToSet, const ReverseIterator &itAfterLastToSet, const ValueType &tValue);
98
99 private:
100 ValueType *m_pData;
101 size_t m_nSize;
102 size_t m_nStart;
103 size_t m_nEof;
104
105 private:
106 void Release();
107 size_t GetWellSize(size_t nSize) const;
108 void MoveData(size_t nIndex, size_t nCount, int nDistance);
109 void CopyData(size_t nIndex, size_t nCount, ValueType *pNewMem) const;
110
111 };
112}
主要的考虑,还是想实现“跨容器的 iterator”(抱歉,我还是觉得这么称呼挺符合我的预期的)。只是,在没有语言层面的 concepts 支持的情况下,如何显式地让用户知道模板参数要符合哪些条件呢?
在这里再次感谢一下 OwnWaterloo 同学,上篇评论里的东西我会继续慢慢琢磨的。^_^
首发:http://www.cppblog.com/Streamlet/archive/2009/09/28/97500.html